package com.neusoft.bizcore.activiti.service;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.neusoft.bizcore.activiti.dto.ProcessInstanceDTO;
import com.neusoft.bizcore.activiti.dto.RecordDTO;
import com.neusoft.bizcore.activiti.dto.TaskDTO;
import com.neusoft.bizcore.auth.common.bean.UserBean;

public interface ProcessInstanceService {

    /**
     * description: 启动一个流程
     *
     * @param type 工单类型
     * @param businessKey 工单号
     * @param user 系统当前登录人
     * @return ProcessInstanceDTO
     */
    ProcessInstanceDTO start(String type, String businessKey, UserBean user);

    /**
     * description: 完成当前节点
     *
     * @param workorderNum 工单号
     * @param taskId 任务ID
     * @param user 操作人
     * @param obj 数据
     */
    void complete(String workorderNum, String taskId, UserBean user);

    /**
     * description: 不通过直接结束流程
     *
     * @param workorderNum 工单号
     * @param taskId 任务ID
     * @param user 审批人
     */
    void finishOfNotPass(String workorderNum, String taskId, UserBean user);

    /**
     * description: 设置全局流程变量
     *
     * @param taskId 任务ID
     * @param variableName 变量名称
     * @param value 变量值
     */
    void setGlobalVariable(String taskId, String variableName, Object value);

    /**
     * description: 设置全局流程变量
     *
     * @param taskId 任务ID
     * @param variables 变量值
     */
    void setGlobalVariables(String taskId, Map<String, Object> variables);

    /**
     * description: 从全局变量里面去取值
     *
     * @param workorderNum 工单号
     * @param variableNames 搜索的变量名名称集合
     * @param type 类型
     * @return Map<String, Object>
     */
    Map<String, Object> getVariables(String workorderNum, List<String> variableNames, String type);

    /**
     * description: 从全局变量里面去取值
     *
     * @param workorderNum 工单号
     * @param variableName 搜索的变量名
     * @return Object
     */
    Object getVariables(String workorderNum, String variableName, String type);

    /**
     * description: 根据任务ID获取节点ID
     *
     * @param taskId 任务ID
     * @return
     */
    String getNodeIdByTaskId(String taskId);

    /**
     * description: 拾取任务
     *
     * @param taskId 任务ID
     * @param user 当前用户
     */
    void claim(String taskId, UserBean user);

    /**
     * description: 获取待办任务
     *
     * @param user 当前用户
     * @return List<TaskDTO>
     */
    List<TaskDTO> getTodoTask(UserBean user);

    /**
     * description: 获取已办任务
     *
     * @param user 当前用户
     * @return List<TaskDTO>
     */
    List<TaskDTO> getDoneTask(UserBean user);

    /**
     * description: 获取流程履历
     *
     * @param workorderNum 工单号
     * @param user 当前用户
     * @return List<RecordDTO>
     */
    List<RecordDTO> getRecords(String workorderNum, UserBean user);

    /**
     * description: 获取同用户上次的任务ID
     *
     * @param taskId 任务ID
     * @param user 当前用户
     * @return String
     */
    String getLastTaskId(String taskId, UserBean user);

    /**
     * description: 获取指定流程对应的流程图image
     *
     * @param procDefId 流程模版定义id
     * @param procInstId 流程实例id
     * @param showHistory 是否显示流程图历史节点渲染.<br/>
     *        true:显示历史节点,使用procInstId。<br/>
     *        false:不显示历史节点,直接使用procDefId。
     * @return InputStream
     */
    InputStream getImage(String type, String workOrderNum, boolean showHistory);
}
